function sub_curry(fn) {
    var args = [].slice.call(arguments, 1) // add 该有的数拿到
    return function() {
        // newArgs 一定代表的是 add 该有的完成的函数
        var newArgs = args.concat([].slice.call(arguments)) // [...arguments]
       return fn.apply(this, newArgs)
    }
}

function curry(fn, length) {
    length = length || fn.length
    var slice = Array.prototype.slice

    return function() {
        if (arguments.length < length) {
            var combined = [fn].concat(slice.call(arguments)) // 
         return   curry(sub_curry.apply(this, combined), length - arguments.length)
        } else {
            return fn(...arguments)
        }
    }
}

var fn = curry(function(a, b, c) {
    return [a, b, c]
})
fn('a','b','c') // ['a', 'b', 'c']
fn('a','b')('c') // ['a', 'b', 'c']
fn('a')('b')('c') // ['a', 'b', 'c']